package pl.edu.pw.elka.jtrzasko.proz.warcaby.model;

import java.io.Serializable;

/**
 * Klasa zawiera informacje o pozycji na plaszy (wspolrzedne)
 */
public class Position implements Serializable
{
	/**
	 * Pierwsza wsolrzdna polozenia
	 */
	private int x;
	/**
	 * Druga wsolrzdna polozenia
	 */
	private int y;

	/**
	 * Nowa pozycja na planszy
	 * 
	 * @param x
	 *            Wspolrzedna X
	 * @param y
	 *            Wspolrzedna Y
	 */
	public Position(int x, int y)
	{
		this.setX(x);
		this.setY(y);
	}

	/**
	 * Nowa pozycja jako pozycja pola lezacego pomiedzy dwoma pozycjami
	 * 
	 * @param p1
	 *            Pierwsza pozycja
	 * @param p2
	 *            Druga pozycja
	 */
	public Position(Position p1, Position p2)
	{
		x = (p1.getX() + p2.getX()) / 2;
		y = (p1.getY() + p2.getY()) / 2;
	}

	public boolean equals(Position p)
	{
		if (this.getX() == p.getX() && this.getY() == p.getY())
			return true;
		return false;

	}

	public void setX(int x)
	{
		this.x = x;
	}

	public int getX()
	{
		return x;
	}

	public void setY(int y)
	{
		this.y = y;
	}

	public int getY()
	{
		return y;
	}

	/**
	 * Pobiera wszytkie pola lezyce pomiedzy dwiema pozycjami
	 * 
	 * @param p1
	 *            Pozycja pierwsza
	 * @param p2
	 *            Pozycja druga
	 * @return Tablcia pozycji lezycych powmiedzy danymi
	 */
	public Position[] getFieldsFromLine(Position p2)
	{
		Position p1 = new Position(x, y);
		Position[] linePositions = new Position[Math.abs(p1.getYdiff(p2)) - 1];
		int i = 1;
		int a = 1;
		int b = Math.max(p1.getY(), p2.getY());
		if ((p2.getYdiff(p1) / p2.getXdiff(p1)) < 0)
		{
			a = -1;
			b = Math.min(p1.getY(), p2.getY());
		}
		for (int x = Math.max(p1.getX(), p2.getX()) - 1; x != Math.min(p1
				.getX(), p2.getX()); x--, i++)
			linePositions[i - 1] = new Position(x, b - a * i);
		return linePositions;
	}

	/**
	 * Pobiera rozwnice wspolrzednych "po X" powmiedzy dwoma pozycjami
	 * 
	 * @param p1
	 *            Pozdycja pierwsza
	 * @param p2
	 *            Pozycja druga
	 * @return Rozanica odleglosci "po X"
	 */
	public int getXdiff(Position p2)
	{
		return getX() - p2.getX();
	}

	/**
	 * Pobiera rozwnice wspolrzednych "po Y" powmiedzy dwoma pozycjami
	 * 
	 * @param p1
	 *            Pozdycja pierwsza
	 * @param p2
	 *            Pozycja druga
	 * @return Rozanica odleglosci "po Y"
	 */
	public int getYdiff(Position p2)
	{
		return getY() - p2.getY();
	}

}